Q: malloc(0) は何をするものですか?free(NULL) とは何ですか?
A: 一見簡単そうに見えるこの質問の答えは、特に、Mac OS の他のメモリ管理 API を対象とするようにこれらのルーチンを一般化する場合は複雑です。表 1 と 2 に、それぞれの場合に通常使用されるルーチンとその機能をまとめます。
表 1. ゼロバイトブロックの割り当て
ルーチン
|
プラットフォーム
|
戻り値 |
malloc
|
ANSI C 仕様
|
NULL または長さゼロのブロックへのポインタ |
malloc
|
Mac OS X System framework
|
長さゼロのブロックへのポインタ |
malloc |
CodeWarrior MSL |
NULL [1] [2] |
CFAllocatorAllocate |
すべて |
NULL [3] |
NewPtr |
すべて |
長さゼロのブロックへのポインタ |
NewHandle |
すべて |
長さゼロのブロックのハンドル |
MPAllocateAligned |
Mac OS X |
長さゼロのブロックへのポインタ |
MPAllocateAligned |
従来の Mac OS |
NULL |
OTAllocMem [InContext ] |
すべて |
長さゼロのブロックへのポインタ |
operator new [] |
ANSI C++ 仕様 |
長さゼロのブロックへのポインタ |
operator new [] |
すべて |
長さゼロのブロックへのポインタ |
|
表 2. NULL ポインタの解放
ルーチン
|
プラットフォーム
|
動作 |
free
|
ANSI C 仕様
|
何もしない |
free |
すべて |
何もしない [1] |
CFAllocatorDeallocate
|
すべて
|
何もしない [4] |
DisposePtr |
Mac OS X |
MemErr を noErr に設定する |
DisposePtr |
従来の Mac OS、PowerPC |
MemErr を noErr に設定する |
DisposePtr |
従来の Mac OS、68K |
無効 |
DisposeHandle |
Mac OS X |
MemErr を nilHandleErr に設定する |
DisposeHandle |
従来の Mac OS |
MemErr を noErr に設定する |
MPFree |
Mac OS X |
無効 [5] |
MPFree |
従来の Mac OS |
何もしない |
OTFreeMem |
すべて |
何もしない |
operator delete |
ANSI C++ 仕様 |
何もしない |
operator delete |
すべて |
何もしない |
|
注記:
- CodeWarrior Pro 8.3 MSL から取得する MSL 情報。
- コンパイル時変数の
_MSL_MALLOC_0_RETURNS_NON_NULL を設定し、MSL を再ビルドすることにより、この戻り値を変更できます。
- この動作は
CFAllocatorAllocate の一部であり、使用される実際のアロケータには依存しません。
- この動作は
CFAllocatorDeallocate の一部であり、使用される実際のアロケータには依存しません。
- 現在のバージョンの Mac OS X(10.2 以前)では、クラッシュはしませんが、代わりに警告メッセージをコンソールに出力します(r. 3227311)。
[2003 年 4 月 14 日]
|